home *** CD-ROM | disk | FTP | other *** search
Text File | 1980-01-01 | 84.0 KB | 2,706 lines |
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1
-
-
-
-
-
- TITLE "APPLE CP/M BIOS"
-
- ;
-
- ;**********************************************************
-
- ;
-
- ; Apple CP/M BIOS Listing
-
- ; =======================
-
- ;
-
- ; Quellencode rekonstruiert von D. Stampe
-
- ; A.U.G.E. M 334
-
- ; f}r A.U.G.E. Mitglieder zur
-
- ; Erg{nzung ihrer Dokumentation
-
- ;
-
- ; SoftCard und Originalcode -
-
- ; Copyright by Microsoft
-
- ;
-
- ; 56 K - System ( mit Language Card )
-
- ; mit Drucker in Slot 1, Com. Card in Slot 2,
-
- ; 80 Zeichenkarte in Slot 3, Z80 in Slot 4
-
- ;
-
- ; Stand 30.10.83
-
- ;
-
- ; Benutzte Quellen:
-
- ; Digital Research: CP/M 2.0 Alteration Guide
-
- ; ( BIOS Entry Points, Disk Parameter Tables,
-
- ; Sector blocking and deblocking )
-
- ; Microsoft: Softcard Dokumentation
-
- ;
-
- ; Nobody is Perfect.
-
- ; Korrekturen und Erg{nzungen erw}nscht an M 334.
-
- ;
-
- ;**********************************************************
-
- PAGE
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-1
-
-
-
-
-
-
-
- .Z80
-
- ;
-
- 0038 MSIZE EQU 56 ;Systemgr|~e in K (56 K/ 44 K)
-
- 9000 BIAS EQU (MSIZE-20)*1024
-
- C400 CBASE EQU BIAS+3400H ;Start CCP
-
- DA00 BIOS EQU CBASE+1600H ;Start BIOS
-
- ;
-
- 0000' ASEG
-
- ORG BIOS
-
- ;
-
-
-
- 0000 BOOT EQU 00000H ;Warmstart Einsprung
-
- 0001 BOOTST EQU 00001H ; "
-
- 0003 IOBYTE EQU 00003H ;Input/Output Flag (f]r PIP, STAT )
-
- 0004 CDISK EQU 00004H ;Current Drive Nummer
-
- 0005 BDOS EQU 00005H ;BDOS Einsprung
-
- 0006 BDOSST EQU 00006H ; "
-
- 03C0 Z80ST EQU 003C0H ; 6502 Adresse Z80 Start
-
- ;
-
- C407 BUFCNT EQU CBASE+07H ;CCP Eingabebuffer Z{hler
-
- C8B2 CCPDIR EQU CBASE+04B2H ;CCP Patch Directory Spaltenzahl
-
- CC06 BDST EQU CBASE+0806H ;BDOS Start-Einsprung
-
- CC0D BDERR EQU CBASE+080DH ;BDOS Fehler-Einsprungadresse
-
- ;
-
- ; Apple I/O - Adressen
-
- ;
-
- E000 APPKBD EQU 0E000H ;Apple Keyboard
-
- E010 APPKST EQU 0E010H ;Keyboard Strobe
-
- E051 TXTSET EQU 0E051H ;Schalter Textseite
-
- E400 Z80CRD EQU 0E400H ;Z80-Karte in Slot 4
-
- EFFF CLRROM EQU 0EFFFH ;Abschalten Expansion-Roms
-
- ;
-
- ; 6502 ]bergabe-speicher ( 6502 Zero Page )
-
- ;
-
- F024 CH EQU 0F024H ;Cursor Horizontal
-
- F028 BASL EQU 0F028H ;Basis-Adresse Schirmspeicher
-
- F032 INVFLG EQU 0F032H ;Flag normal=0FFH/invers=03FH
-
- F045 A$ACC EQU 0F045H ;6502 Akku-Zwischenspeicher
-
- F046 A$XREG EQU 0F046H ;6502 X-Register
-
- F047 A$YREG EQU 0F047H ;6502 Y-Register
-
- ;
-
- F3D0 A$VEC EQU 0F3D0H ;Vektor 6502 Routinen
-
- F3E0 PHTS EQU 0F3E0H ;Track
-
- F3E4 DRV12 EQU 0F3E4H ;Drive 1 = 01H oder Drive 2 Flag
-
- F3E6 DSKSLT EQU 0F3E6H ;Slot Disk, Slot #6 =060H
-
- F3EA DERR EQU 0F3EAH ;Fehler-Code Disk-Routine
-
- F3EB RDWR EQU 0F3EBH ;Read=01H/Write=02H
-
- F678 BYTE EQU 0F678H ;Zwischenspeicher I/O-Card
-
- F6F8 SLOT EQU 0F6F8H ;Slot I/O-Card
-
- PAGE
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-2
-
-
-
-
-
-
-
- ; BIOS Entry Tabelle
-
- ; ==================
-
- ;
-
- ; Kaltstart
-
- DA00 C9 START: RET ;JP STRTUP initial
-
- DA01 DEA8 DEFW STRTUP ; "
-
- ; Warmstart
-
- DA03 C3 DACC WBOOTE: JP WBOOT
-
- ; Console Status
-
- DA06 C3 DB08 JP CONST
-
- ; Console Input
-
- DA09 C3 DB12 JP CONIN
-
- ; Console Output
-
- DA0C C3 DB43 JP CONOUT
-
- ; List Drucker
-
- DA0F C3 DB66 JP LIST
-
- ; Punch Stanzer
-
- DA12 C3 DB75 JP PUNCH
-
- ; Reader Leser
-
- DA15 C3 DB87 JP READER
-
- ; Laufwerk Spur 0
-
- DA18 C3 DD4B JP HOME
-
- ; Auswahl Disk-Laufwerk
-
- DA1B C3 DD6D JP SELDSK
-
- ; Auswahl Track
-
- DA1E C3 DD56 JP SETTRK
-
- ; Auswahl Sektor
-
- DA21 C3 DD89 JP SETSEC
-
- ; Buffer f}r Disk-Routinen festlegen
-
- DA24 C3 DD8E JP SETDMA
-
- ; Read Lesen Disk
-
- DA27 C3 DD93 JP READ
-
- ; Write Schreiben Disk
-
- DA2A C3 DDA3 JP WRITE
-
- ; LISTST List Status
-
- DA2D AF XOR A ;Akku = 0 immer
-
- DA2E C9 RET
-
- DA2F 00 NOP
-
- ; SECTRAN Sektor umsetzen
-
- DA30 60 LD H,B ;hier keine Umsetzung
-
- DA31 69 LD L,C
-
- DA32 C9 RET
-
- ;
-
- ; Disk Parameter Header f}r 6 Laufwerke A: ... F:
-
- ;
-
- DA33 0000 0000 DPE0: DEFW 0,0,0,0,DIRBUF,DPB,CSV0,ALV0
-
- DA37 0000 0000
-
- DA3B DEBA DA93
-
- DA3F DF9A DF3A
-
- DA43 0000 0000 DEFW 0,0,0,0,DIRBUF,DPB,CSV1,ALV1
-
- DA47 0000 0000
-
- DA4B DEBA DA93
-
- DA4F DFA6 DF4A
-
- DA53 0000 0000 DEFW 0,0,0,0,DIRBUF,DPB,CSV2,ALV2
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-3
-
-
-
-
-
- DA57 0000 0000
-
- DA5B DEBA DA93
-
- DA5F DFB2 DF5A
-
- DA63 0000 0000 DEFW 0,0,0,0,DIRBUF,DPB,CSV3,ALV3
-
- DA67 0000 0000
-
- DA6B DEBA DA93
-
- DA6F DFBE DF6A
-
- DA73 0000 0000 DEFW 0,0,0,0,DIRBUF,DPB,CSV4,ALV4
-
- DA77 0000 0000
-
- DA7B DEBA DA93
-
- DA7F DFCA DF7A
-
- DA83 0000 0000 DEFW 0,0,0,0,DIRBUF,DPB,CSV5,ALV5
-
- DA87 0000 0000
-
- DA8B DEBA DA93
-
- DA8F DFD6 DF8A
-
- ;
-
- ; Disk Parameter Block
-
- ;
-
- DA93 0020 DPB: DEFW 0020H ;32 Sektoren/Track
-
- DA95 03 DEFB 003H ;
-
- DA96 07 DEFB 007H ;
-
- DA97 00 DEFB 000H ;
-
- DA98 007F DEFW 007FH ;total 128 * 1K-Bl|cke
-
- DA9A 002F DEFW 002FH ;total 48 Directory Entries
-
- DA9C C0 DEFB 0C0H ;2 Bl|cke f}r Directory
-
- DA9D 00 DEFB 000H ; "
-
- DA9E 000C DEFW 000CH ;Gr|sse Dir Check-Vektor
-
- DAA0 0003 DEFW 0003H ;reservierte Tracks f}r System
-
- ;
-
- ; Initialisierung der I/O-Karten
-
- ;
-
- DAA2 11 0007 INICRD: LD DE,00007H ;Slot 7 anfangend
-
- DAA5 21 F3B8 WEITER: LD HL,SLTTAB-1 ;Basis Slot-Tabelle
-
- DAA8 19 ADD HL,DE
-
- DAA9 7E LD A,(HL)
-
- DAAA D6 03 SUB 003H ;3 = Com. Card
-
- DAAC 20 07 JR NZ,NOCOM
-
- DAAE CD DD60 CALL SLSTAT
-
- DAB1 36 03 LD (HL),003H ;Reset Com. Card
-
- DAB3 36 15 LD (HL),015H ;300 Baud Com. Card, 8+1 bit
-
- DAB5 3D NOCOM: DEC A ;2 = Serial Card
-
- DAB6 20 09 JR NZ,NOSER
-
- DAB8 CD DCEE CALL PREP
-
- DABB 21 C800 LD HL,0C800H ;Init-Routine Ser. Card
-
- DABE CD DB3B CALL C6502 ;$C800 = 6502 Adresse Init
-
- DAC1 1D NOSER: DEC E
-
- DAC2 20 E1 JR NZ,WEITER ;n{chsten Slot kontrollieren
-
- DAC4 C9 RET
-
- ;
-
- ; Rechnung Start-Adresse Slot-Prom
-
- ; E = Slot-Nr. 0...7, -> HL = Start-Adresse
-
- ;
-
- DAC5 21 E000 SLTADD: LD HL,0E000H ;Basis I/O-Bereich
-
- DAC8 7B LD A,E
-
- DAC9 B4 OR H
-
- DACA 67 LD H,A
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-4
-
-
-
-
-
- DACB C9 RET
-
- ;
-
- DACC 31 0080 WBOOT: LD SP,00080H
-
- DACF 3A E051 LD A,(TXTSET)
-
- DAD2 21 0E00 LD HL,00E00H ;$0E00 = 6502 Adresse BOOT CCP
-
- DAD5 CD DFE8 CALL PATCH1 ;Patch CCP-Eingabebuffer l|schen
-
- DAD8 CD DAA2 CALL INICRD ;I/O-Karten initialisieren
-
- DADB AF WBOOT1: XOR A
-
- DADC 32 DEB4 LD (UNACNT),A
-
- DADF 32 DEAF LD (HSTACT),A
-
- DAE2 3E C3 LD A,0C3H ;(JMP) - Befehl
-
- DAE4 32 0000 LD (BOOT),A
-
- DAE7 21 DA03 LD HL,WBOOTE
-
- DAEA 22 0001 LD (BOOTST),HL
-
- DAED 32 0005 LD (BDOS),A
-
- DAF0 21 CC06 LD HL,BDST ;BDOS Einsprung
-
- DAF3 22 0006 LD (BDOSST),HL
-
- DAF6 01 0080 LD BC,00080H
-
- DAF9 CD DD8E CALL SETDMA
-
- DAFC 3E 03 DIRP: LD A,003H ;03H -> 4 Spalten,
-
- ; ;LD A,001H initial = (2 Sp.)
-
- DAFE 32 C8B2 LD (CCPDIR),A ;CCP Patch Directory-Breite
-
- DB01 3A 0004 LD A,(CDISK)
-
- DB04 4F LD C,A ;C = Log In Disk
-
- DB05 C3 C400 JP CBASE
-
- ;
-
- ; I/O - Routinen
-
- ; ==============
-
- ;
-
- ; Console Status
-
- ;
-
- DB08 2A F380 CONST: LD HL,(VECCOS)
-
- DB0B E9 JP (HL)
-
- ;
-
- ; Console Status f}r Apple Keyboard
-
- ; Akku = 0FFH :Zeichen da, sonst Akku = 0
-
- ;
-
- DB0C 3A E000 KEYBST: LD A,(APPKBD) ;initial
-
- DB0F 17 RLA ;
-
- ;LD A,(0E0B0H) f}r Slot 3 Com.card
-
- ;RRA
-
- DB10 9F SBC A,A
-
- DB11 C9 RET
-
- ;
-
- ; Console Input
-
- ; Eingabezeichen werden mit Zeichen der Umcodiertabelle
-
- ; verglichen und bei ]bereinstimmung passend ersetzt.
-
- ;
-
- DB12 CD DB50 CONIN: CALL CONINP
-
- DB15 21 F3AB LD HL,CHRRED-1 ;Basis f}r Keyboard Redefinition
-
- DB18 06 06 LD B,006H ;maximal 6 Umcodierungen
-
- DB1A 4F LD C,A
-
- DB1B 23 TSTKEY: INC HL
-
- DB1C 7E LD A,(HL)
-
- DB1D 23 INC HL
-
- DB1E B7 OR A
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-5
-
-
-
-
-
- DB1F FA DB27 JP M,ENDKEY
-
- DB22 B9 CP C
-
- DB23 7E LD A,(HL)
-
- DB24 C8 RET Z ;R}cksprung mit Ersetzung
-
- DB25 10 F4 DJNZ TSTKEY
-
- DB27 79 ENDKEY: LD A,C ;keine Ersetzung
-
- DB28 C9 RET
-
- ;
-
- ; Console Input externes Terminal in Slot 3
-
- ;
-
- DB29 11 0003 CIEXT: LD DE,00003H ;Slot 3
-
- DB2C C3 DD1C JP RDSER ; Slot 3 Ser. Card
-
- ;JP KEYBIN initial
-
- ;JP RDCOM Slot 3 Com. Card
-
- ;
-
- ; Console Input Apple Keyboard
-
- ;
-
- DB2F 3A E000 KEYBIN: LD A,(APPKBD)
-
- DB32 17 RLA
-
- DB33 30 FA JR NC,KEYBIN ;warte auf Tastendruck
-
- DB35 32 E010 LD (APPKST),A
-
- DB38 3F CCF ;MSB = 0
-
- DB39 1F RRA
-
- DB3A C9 RET
-
- ;
-
- ; Aufruf von 6502 Routinen
-
- ; 6502-Start-Adresse in HL
-
- ;
-
- DB3B 22 F3D0 C6502: LD (A$VEC),HL
-
- DB3E 32 E400 LD (Z80CRD),A ;LD (0000H),A initial
-
- DB41 C9 RET
-
- ;
-
- ; IOBYTE - Behandlung
-
- ; ===================
-
- ;
-
- DB42 4F CO: LD C,A
-
- DB43 3A 0003 CONOUT: LD A,(IOBYTE)
-
- DB46 E6 03 AND 003H ;Console Feld
-
- DB48 FE 02 CP 002H ;TTY=00 CRT=01 BAT=02 UC1=03
-
- DB4A 20 4B JR NZ,CON
-
- DB4C 2A F392 LIST1: LD HL,(VECLI1) ;Bei BAT ist LST console out
-
- DB4F E9 JP (HL)
-
- ;
-
- DB50 3A 0003 CONINP: LD A,(IOBYTE)
-
- DB53 E6 03 AND 003H ;Console Feld
-
- DB55 FE 02 CP 002H
-
- DB57 2A F384 LD HL,(VECCI2)
-
- DB5A 28 06 JR Z,READ1 ;Bei BAT ist RDR console in
-
- DB5C 30 07 JR NC,JMPHL
-
- DB5E 2A F382 CI1: LD HL,(VECCI1)
-
- DB61 E9 JP (HL)
-
- ;
-
- DB62 2A F38A READ1: LD HL,(VECRE1)
-
- DB65 E9 JMPHL: JP (HL)
-
- ;
-
- DB66 3A 0003 LIST: LD A,(IOBYTE)
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-6
-
-
-
-
-
- DB69 E6 C0 AND 0C0H ;LIST Feld
-
- DB6B FE 80 CP 080H ;TTY=00, CRT=40, LPT=80, UL1=C0
-
- DB6D 38 27 JR C,TTY
-
- DB6F 28 DB JR Z,LIST1
-
- DB71 2A F394 LD HL,(VECLI2)
-
- DB74 E9 JP (HL)
-
- ;
-
- DB75 3A 0003 PUNCH: LD A,(IOBYTE)
-
- DB78 E6 30 AND 030H ;PUNCH Feld
-
- DB7A FE 10 CP 010H ;TTY=00, PTP=10, UP1=20, UP2=30
-
- DB7C 38 18 JR C,TTY
-
- DB7E 2A F38E LD HL,(VECPU1)
-
- DB81 20 E2 JR NZ,JMPHL
-
- DB83 2A F390 LD HL,(VECPU2)
-
- DB86 E9 JP (HL)
-
- ;
-
- DB87 3A 0003 READER: LD A,(IOBYTE)
-
- DB8A E6 0C AND 00CH ;READER Feld
-
- DB8C FE 04 CP 004H ;TTY=00, PTR=04, UR1=08, UR2=0C
-
- DB8E 38 CE JR C,CI1
-
- DB90 28 D0 JR Z,READ1
-
- DB92 2A F38C LD HL,(VECRE2)
-
- DB95 E9 JP (HL)
-
- ;
-
- ; Kontrolle, ob Ausgabezeichen in Software Screen Function
-
- ; Tabelle enthalten, bei ja, ersetzen durch entsprechendes
-
- ; Zeichen aus Hardware Screen Function Tabelle.
-
- ; Bearbeitung von Steuerzeichenfolgen.
-
- ; Zeichen in C-Register
-
- ;
-
- DB96 37 TTY: SCF ;TTY:, CRT:
-
- DB97 9F CON: SBC A,A ;CONFLG = 0FFH f}r TTY:,CRT:
-
- DB98 21 DEA2 LD HL,CONFLG ; = 000H f}r UC1:
-
- DB9B 77 LD (HL),A
-
- DB9C CB B9 RES 7,C
-
- DB9E 23 INC HL ;CNTFLG
-
- DB9F 7E LD A,(HL)
-
- DBA0 B7 OR A
-
- DBA1 28 3D JR Z,TCONT
-
- DBA3 35 DEC (HL) ;CNTFLG - 1
-
- DBA4 3A F396 LD A,(SXYOFF)
-
- DBA7 21 DEAB LD HL,CURX
-
- DBAA 28 0C JR Z,NOCH1 ;Z = noch 1 Zeichen
-
- DBAC B7 OR A ;Behandlung Cursor Adressierung
-
- DBAD F2 DBB3 JP P,SUBOF2 ;P = Y,X
-
- DBB0 2B DEC HL
-
- DBB1 E6 7F SUBOFF: AND 07FH
-
- DBB3 5F SUBOF2: LD E,A
-
- DBB4 79 LD A,C
-
- DBB5 93 SUB E ;subtrahiere Offset
-
- DBB6 77 LD (HL),A ;speichere CURX oder CURY
-
- DBB7 C9 RET
-
- ;
-
- ; Cursoradressierung x,y
-
- ;
-
- DBB8 B7 NOCH1: OR A
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-7
-
-
-
-
-
- DBB9 FA DBBD JP M,XY ;M = X,Y
-
- DBBC 2B DEC HL
-
- DBBD CD DBB1 XY: CALL SUBOFF
-
- DBC0 2A DEAA LD HL,(CURY)
-
- DBC3 3A F3A1 LD A,(HXYOFF)
-
- DBC6 B7 OR A
-
- DBC7 F2 DBCF JP P,NOSWAP ;P = Y,X
-
- DBCA E6 7F AND 07FH
-
- DBCC 5D LD E,L ;H und L tauschen
-
- DBCD 6C LD L,H
-
- DBCE 63 LD H,E
-
- DBCF 5F NOSWAP: LD E,A ;Offset addieren
-
- DBD0 84 ADD A,H
-
- DBD1 4F LD C,A
-
- DBD2 7B LD A,E
-
- DBD3 85 ADD A,L
-
- DBD4 F5 PUSH AF
-
- DBD5 06 07 LD B,007H ;Funktion 7
-
- DBD7 CD DC2D CALL FINISH ;1. Koordinate
-
- DBDA F1 POP AF
-
- DBDB 06 0A LD B,00AH ;Funktion 10
-
- DBDD 4F COUT: LD C,A ;2. Koordinate
-
- DBDE 18 4D JR FINISH
-
- ;
-
- DBE0 47 TCONT: LD B,A ;Teste auf Steuerzeichen
-
- DBE1 21 DEA4 LD HL,LDINFL
-
- DBE4 7E LD A,(HL)
-
- DBE5 5F LD E,A
-
- DBE6 B7 OR A
-
- DBE7 20 11 JR NZ,SRCH2 ;NZ = kein Lead-In
-
- DBE9 3A F397 LD A,(SFLDIN)
-
- DBEC B7 OR A
-
- DBED 28 06 JR Z,SEARCH ;z = kein Lead-In-Zeichen n|tig
-
- DBEF B9 CP C
-
- DBF0 20 03 JR NZ,SEARCH ;ist Lead-In-Zeichen ?
-
- DBF2 36 80 LD (HL),080H ;wenn ja, LDINFL = 080H
-
- DBF4 C9 RET
-
- ;
-
- ; Suche in Software-Tabelle
-
- ;
-
- DBF5 3E 1F SEARCH: LD A,01FH
-
- DBF7 B9 CP C ;ist Steuerzeichen ?
-
- DBF8 38 33 JR C,FINISH
-
- DBFA 21 F3A0 SRCH2: LD HL,HXYOFF-1 ;Ende Screen Funct. Table Software
-
- DBFD 06 09 LD B,009H ;9 Funktionen m|glich
-
- DBFF 7E TESTFN: LD A,(HL)
-
- DC00 B7 OR A
-
- DC01 28 04 JR Z,NOTAVL ;Z = Funktion nicht vorhanden
-
- DC03 AB XOR E
-
- DC04 B9 CP C
-
- DC05 28 05 JR Z,MATCH
-
- DC07 2B NOTAVL: DEC HL ;testet r}ckw{rts
-
- DC08 10 F5 DJNZ TESTFN ;teste weiter
-
- DC0A 18 21 JR FINISH ;nicht gefunden
-
- ;
-
- ; Ersetzen von Steuerzeichen
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-8
-
-
-
-
-
- ;
-
- DC0C 11 000B MATCH: LD DE,0000BH ;Offset Hard- zu Software-Tabelle
-
- DC0F 19 ADD HL,DE
-
- DC10 7E LD A,(HL)
-
- DC11 B7 OR A
-
- DC12 4F LD C,A
-
- DC13 F2 DC23 JP P,NOLEAD ;P = kein Lead-In n|tig
-
- DC16 E6 7F AND 07FH
-
- DC18 4F LD C,A
-
- DC19 C5 PUSH BC
-
- DC1A 3A F3A2 LD A,(HFLDIN)
-
- DC1D 06 07 LD B,007H
-
- DC1F CD DBDD CALL COUT ;Lead-In ausgeben
-
- DC22 C1 POP BC
-
- DC23 78 NOLEAD: LD A,B
-
- DC24 FE 07 CP 007H ;Funktion 7 = Adress Cursor
-
- DC26 20 05 JR NZ,FINISH
-
- DC28 3E 02 LD A,002H ;noch 2 Zeichen
-
- DC2A 32 DEA3 LD (CNTFLG),A
-
- DC2D AF FINISH: XOR A
-
- DC2E 32 DEA4 LD (LDINFL),A ;Lead-In erledigt
-
- DC31 3A DEA2 LD A,(CONFLG) ;UC1: oder TTY: ?
-
- DC34 B7 OR A
-
- DC35 2A F388 LD HL,(VECCO2) ;UC1:
-
- DC38 28 03 JR Z,JPHL1
-
- DC3A 2A F386 LD HL,(VECCO1) ;TTY:
-
- DC3D E9 JPHL1: JP (HL)
-
- ;
-
- ; Console Ausgabe externes Terminal
-
- ;
-
- DC3E 11 0003 COEXT: LD DE,00003H ;Slot 3
-
- DC41 C3 DD04 JP WRSER ; Slot 3 Ser. Card
-
- ;JP APPSCR initial
-
- ;JP WRCOM Slot 3 Com. Card
-
- ;
-
- ; Apple Screen Output
-
- ;
-
- DC44 2A DEA5 APPSCR: LD HL,(SCRCUR)
-
- DC47 3A DEA7 LD A,(SCRZCH)
-
- DC4A 77 LD (HL),A
-
- DC4B CD DC6B CALL SCRFUN
-
- DC4E 2A F028 LD HL,(BASL)
-
- DC51 3A F024 LD A,(CH)
-
- DC54 5F LD E,A ;Rechnung Bildschirm-Adresse
-
- DC55 16 F0 LD D,0F0H ;Z80- = 6502 Adresse + $F000
-
- DC57 19 ADD HL,DE
-
- DC58 22 DEA5 LD (SCRCUR),HL
-
- DC5B 7E LD A,(HL)
-
- DC5C 32 DEA7 LD (SCRZCH),A
-
- DC5F FE E0 CP 0E0H
-
- DC61 38 02 JR C,UP
-
- DC63 EE 20 XOR 020H ;Upper Case erzeugen
-
- DC65 E6 3F UP: AND 03FH
-
- DC67 F6 40 OR 040H
-
- DC69 77 LD (HL),A
-
- DC6A C9 RET
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-9
-
-
-
-
-
- ;
-
- ; Screen Function Routine
-
- ; Register B enth{lt Funktions Nr.
-
- ;
-
- DC6B 78 SCRFUN: LD A,B
-
- DC6C B7 OR A
-
- DC6D 28 0B JR Z,NOFUN
-
- DC6F 21 DB3B LD HL,C6502
-
- DC72 E5 PUSH HL
-
- DC73 21 DCD4 LD HL,FUNTAB-1 ;Einsprung aus Tabelle holen
-
- DC76 85 ADD A,L
-
- DC77 6F LD L,A
-
- DC78 6E LD L,(HL)
-
- DC79 E9 JP (HL)
-
- ;
-
- DC7A 79 NOFUN: LD A,C
-
- DC7B FE 0D CP 00DH ;Carriage Return
-
- DC7D 20 05 JR NZ,NOCR
-
- DC7F AF XOR A
-
- DC80 32 F024 LD (CH),A ;CH = 0
-
- DC83 C9 RET
-
- ;
-
- DC84 F6 80 NOCR: OR 080H
-
- DC86 FE E0 CP 0E0H
-
- DC88 38 04 JR C,UC
-
- DC8A 21 F3DD LD HL,0F3DDH ;$F3DD = Maske Upper Case
-
- DC8D AE XOR (HL) ; =020H f}r Gro~/Kleinschreib.
-
- DC8E 32 F045 UC: LD (A$ACC),A
-
- DC91 21 FDF0 LD HL,0FDF0H ;$FDF0 = 6502 COUT1
-
- DC94 18 79 JR CC6502
-
- ;
-
- ;
-
- DC96 3E FF FUN4: LD A,0FFH ;normal
-
- DC98 01 DEFB 001H ; (LD BC,..) }berspringt n. Befehl
-
- DC99 3E 3F FUN5: LD A,03FH ;inverse
-
- DC9B 32 F032 LD (INVFLG),A
-
- DC9E E1 FUN7: POP HL
-
- DC9F C9 RET
-
- ;
-
- ;
-
- DCA0 21 FBF4 FUN9: LD HL,0FBF4H ;$FBF4 = 6502 ADVANCE
-
- DCA3 C9 RET
-
- ;
-
- ;
-
- DCA4 AF FUN6: XOR A ;Home Cursor
-
- DCA5 6F LD L,A ;CH, CV = 0
-
- DCA6 67 LD H,A
-
- DCA7 22 F024 LD (CH),HL
-
- DCAA 32 F045 BASCAL: LD (A$ACC),A
-
- DCAD 21 FBC1 LD HL,0FBC1H ;$FBC1 = 6502 BASCALC
-
- DCB0 C9 RET
-
- ;
-
- DCB1 2E 42 FUN2: LD L,042H ;$FC42 = 6502 CLREOP
-
- DCB3 01 DEFB 001H ; (LD BC,..) }berspringt n. Befehl
-
- DCB4 2E 9C FUN3: LD L,09CH ;$FC9C = 6502 CLREOL
-
- DCB6 01 DEFB 001H ; (LD BC,..)
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-10
-
-
-
-
-
- DCB7 2E 1A FUN8: LD L,01AH ;$FC1A = 6502 UP
-
- DCB9 01 DEFB 001H ; (LD BC,..)
-
- DCBA 2E 58 FUN1: LD L,058H ;$FC58 = 6502 HOME
-
- DCBC 26 FC LD H,0FCH
-
- DCBE C9 RET
-
- ;
-
- DCBF 2A DEAA FUN10: LD HL,(CURY) ;kontrolliere auf Schirmfenster
-
- DCC2 7D LD A,L
-
- DCC3 FE 28 CP 028H ;40 Spalten
-
- DCC5 38 02 JR C,XOK
-
- DCC7 2E 00 LD L,000H
-
- DCC9 7C XOK: LD A,H
-
- DCCA FE 18 CP 018H ;24 Zeilen
-
- DCCC 38 02 JR C,YOK
-
- DCCE 26 00 LD H,000H
-
- DCD0 22 F024 YOK: LD (CH),HL
-
- DCD3 18 D5 JR BASCAL
-
- ;
-
- ; Tabelle Screen Functions
-
- ;
-
- DCD5 BA FUNTAB: DEFB LOW (FUN1) ;Function 1 Clear Screen
-
- DCD6 B1 DEFB LOW (FUN2) ;Function 2 Clear to End of Page
-
- DCD7 B4 DEFB LOW (FUN3) ;Function 3 Clear to End of Line
-
- DCD8 96 DEFB LOW (FUN4) ;Function 4 Set Normal
-
- DCD9 99 DEFB LOW (FUN5) ;Function 5 Set Inverse
-
- DCDA A4 DEFB LOW (FUN6) ;Function 6 Home Cursor
-
- DCDB 9E DEFB LOW (FUN7) ;Function 7 Address Cursor
-
- DCDC B7 DEFB LOW (FUN8) ;Function 8 Move Up Cursor
-
- DCDD A0 DEFB LOW (FUN9) ;Function 9 Non-Destr. Move Forw.
-
- DCDE BF DEFB LOW (FUN10) ;Function 10 (Adress Curs.)
-
- ;
-
- ; Ausgabe Communications Card
-
- ;
-
- DCDF CD DD60 WRCOM: CALL SLSTAT
-
- DCE2 7E CMWAIT: LD A,(HL)
-
- DCE3 E6 02 AND 002H
-
- DCE5 28 FB JR Z,CMWAIT ;warte auf UART
-
- DCE7 2C INC L
-
- DCE8 71 LD (HL),C
-
- DCE9 C9 RET
-
- ;
-
- DCEA 79 SPREP: LD A,C
-
- DCEB 32 F045 LD (A$ACC),A
-
- DCEE CD DD5B PREP: CALL SLTDAT
-
- DCF1 32 F6F8 LD (SLOT),A
-
- DCF4 32 F047 LD (A$YREG),A
-
- DCF7 3A EFFF LD A,(CLRROM)
-
- DCFA CD DAC5 CALL SLTADD
-
- DCFD D6 20 SUB 020H
-
- DCFF 32 F046 LD (A$XREG),A ;High-Byte Slot 6502
-
- DD02 7E LD A,(HL)
-
- DD03 C9 RET
-
- ;
-
- ; Ausgabe Serial Card
-
- ;
-
- DD04 CD DCEA WRSER: CALL SPREP
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-11
-
-
-
-
-
- DD07 21 F678 LD HL,BYTE ;BYTE ist slotabh{ngig
-
- DD0A 19 ADD HL,DE
-
- DD0B 71 LD (HL),C
-
- DD0C 21 C9AA LD HL,0C9AAH ;$C9AA = 6502 Write Serial Card
-
- DD0F C3 DB3B CC6502: JP C6502
-
- ;
-
- ; Eingabe Communications Card
-
- ;
-
- DD12 CD DD60 RDCOM: CALL SLSTAT
-
- DD15 7E RCWAIT: LD A,(HL)
-
- DD16 1F RRA
-
- DD17 30 FC JR NC,RCWAIT ;warte auf UART
-
- DD19 2C INC L
-
- DD1A 7E LD A,(HL)
-
- DD1B C9 RET
-
- ;
-
- ; Eingabe Serial Card
-
- ;
-
- DD1C CD DCEE RDSER: CALL PREP
-
- DD1F 21 C84D LD HL,0C84DH ;$C84D = 6502 Read Serial Card
-
- DD22 CD DB3B CALL C6502
-
- DD25 21 F678 LD HL,BYTE ;BYTE slotabh{ngig
-
- DD28 19 ADD HL,DE
-
- DD29 7E LD A,(HL)
-
- DD2A C9 RET
-
- ;
-
- DD2B 11 0001 LSTOUT: LD DE,00001H ;Slot 1 Printer
-
- DD2E C3 DD31 JP WPRINT ; Slot 1 Par. Print Card
-
- ;JP RET1 initial
-
- ;JP WRCOM Slot 1 Com. Card
-
- ;JP WRSER Slot 1 Ser. Card
-
- ;
-
- DD31 CD DAC5 WPRINT: CALL SLTADD
-
- DD34 2E C1 LD L,0C1H ;$E9C1 = Status-Adresse Printer
-
- DD36 7E PWAIT: LD A,(HL)
-
- DD37 17 RLA
-
- DD38 38 FC JR C,PWAIT ;warte auf Printer ready
-
- DD3A CD DD5B CALL SLTDAT
-
- DD3D 71 LD (HL),C
-
- DD3E C9 RET1: RET
-
- ;
-
- DD3F 11 0002 PUNOUT: LD DE,00002H ;Slot 2 Punch
-
- DD42 C3 DCDF JP WRCOM ; Slot 2 Com. Card
-
- ;JP RET1 initial
-
- ;JP WRSER Slot 2 Ser. Card
-
- ;JP WPRINT Slot 2 Par. Print Card
-
- ;
-
- DD45 11 0002 READIN: LD DE,00002H ;Slot 2 Reader
-
- DD48 C3 DD12 JP RDCOM ; Slot 2 Com. Card
-
- ;LD A,01AH; RET, wenn kein Input
-
- ;JP RDSER Slot 2 Ser. Card
-
- ;JP 0000H initial
-
- ;
-
- ; DISK - Routinen
-
- ; ===============
-
- ;
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-12
-
-
-
-
-
- DD4B 3A DEB0 HOME: LD A,(HOSTWR)
-
- DD4E B7 OR A
-
- DD4F 20 03 JR NZ,NOTWR
-
- DD51 32 DEAF LD (HSTACT),A
-
- DD54 0E 00 NOTWR: LD C,000H
-
- DD56 79 SETTRK: LD A,C
-
- DD57 32 DEA8 LD (IOTRK),A
-
- DD5A C9 RET
-
- ;
-
- ; Berechnung slotabh{ngiger Adressen
-
- ; HL = Basis + 16 * E-Reg.
-
- ;
-
- DD5B 21 E080 SLTDAT: LD HL,0E080H
-
- DD5E 18 03 JR SLT1
-
- ;
-
- DD60 21 E08E SLSTAT: LD HL,0E08EH
-
- DD63 7B SLT1: LD A,E
-
- DD64 87 SLT2: ADD A,A
-
- DD65 87 ADD A,A
-
- DD66 87 ADD A,A
-
- DD67 87 ADD A,A
-
- DD68 F5 PUSH AF
-
- DD69 85 ADD A,L
-
- DD6A 6F LD L,A
-
- DD6B F1 POP AF ;Akku = 16 * E
-
- DD6C C9 RET
-
- ;
-
- DD6D 11 DEAC SELDSK: LD DE,OLDDRV
-
- DD70 21 0004 LD HL,CDISK
-
- DD73 3A F3B8 LD A,(DSKCNT)
-
- DD76 3D DEC A
-
- DD77 B9 CP C ;Drive-Nummer erlaubt ?
-
- DD78 38 0A JR C,DSKERR
-
- DD7A 7E LD A,(HL)
-
- DD7B 12 LD (DE),A
-
- DD7C 13 INC DE
-
- DD7D 79 LD A,C
-
- DD7E 12 LD (DE),A
-
- DD7F 21 DA33 LD HL,DPE0 ;HL zeigt auf Disk Param. Header
-
- DD82 18 E0 JR SLT2
-
- ;
-
- DD84 1A DSKERR: LD A,(DE) ;Fehler: Drive nicht vorhanden
-
- DD85 77 LD (HL),A
-
- DD86 2E 00 LD L,000H ;HL = 0000
-
- DD88 C9 RET
-
- ;
-
- DD89 79 SETSEC: LD A,C
-
- DD8A 32 DEA9 LD (IOSEC),A
-
- DD8D C9 RET
-
- ;
-
- DD8E ED 43 DEB8 SETDMA: LD (IOBUF),BC
-
- DD92 C9 RET
-
- ;
-
- ; Disk Block/Deblock-Routinen
-
- ; vergleiche auch CP/M Alteration Guide
-
- ;
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-13
-
-
-
-
-
- ; CP/M BDOS 1K Bl|cke
-
- ; CP/M BIOS 128 Bytes records
-
- ; Apple Drive 256 Bytes Sektoren
-
- ;
-
- ; Bei Read Kontrolle, ob unmittelbar vorher schon
-
- ; entsprechenden Apple-Drive Sektor gelesen. Dann nicht
-
- ; noch einmal lesen. Vor dem Lesen Kontrolle, ob Disk-
-
- ; Buffer erst noch geschrieben werden mu~.
-
- ; Bei Write Kontrolle, ob vorher Lesen der zweiten H{lfte
-
- ; der 256 Byte Disk-Buffers n|tig.
-
- ;
-
- DD93 AF READ: XOR A
-
- DD94 32 DEB4 LD (UNACNT),A
-
- DD97 3E 02 LD A,002H
-
- DD99 21 DEB1 LD HL,READOP
-
- DD9C 77 LD (HL),A ;READOP = 2, read
-
- DD9D 23 INC HL
-
- DD9E 77 LD (HL),A ;WRTYPE = 2, unallocated
-
- DD9F 23 INC HL
-
- DDA0 77 LD (HL),A ;RSFLAG = 2, read
-
- DDA1 18 4F JR RWOPER
-
- ;
-
- ; Write: BDOS-Information in C-Register:
-
- ; C = 0 normal sector write
-
- ; C = 1 directory write
-
- ; C = 2 first sector write, unallocated
-
- ;
-
- DDA3 61 WRITE: LD H,C
-
- DDA4 2E 00 LD L,000H
-
- DDA6 22 DEB1 LD (READOP),HL
-
- DDA9 79 LD A,C
-
- DDAA FE 02 CP 002H ;Write unallocated? erster Sektor
-
- DDAC 20 0F JR NZ,CHKUNA
-
- DDAE 2E 08 LD L,008H ;1 K / 128 Bytes
-
- DDB0 3A DEAD LD A,(NEWDRV)
-
- DDB3 67 LD H,A
-
- DDB4 22 DEB4 LD (UNACNT),HL
-
- DDB7 2A DEA8 LD HL,(IOTRK)
-
- DDBA 22 DEB6 LD (UNATRK),HL
-
- DDBD 21 DEB4 CHKUNA: LD HL,UNACNT ;Check unallocated
-
- DDC0 7E LD A,(HL)
-
- DDC1 B7 OR A ;noch Sektoren unallocated?
-
- DDC2 28 28 JR Z,ALLOC
-
- DDC4 35 DEC (HL) ;UNACNT - 1
-
- DDC5 3A DEAD LD A,(NEWDRV)
-
- DDC8 23 INC HL ;UNADSK
-
- DDC9 BE CP (HL) ;gleicher Drive ?
-
- DDCA 20 20 JR NZ,ALLOC
-
- ;
-
- DDCC 3A DEA8 LD A,(IOTRK) ;ja, gleicher Drive
-
- DDCF 2A DEB6 LD HL,(UNATRK)
-
- DDD2 BD CP L
-
- DDD3 20 17 JR NZ,ALLOC
-
- DDD5 3A DEA9 LD A,(IOSEC)
-
- DDD8 BC CP H ;gleicher Sektor, gleicher Track ?
-
- DDD9 20 11 JR NZ,ALLOC
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-14
-
-
-
-
-
- DDDB 24 INC H
-
- DDDC 7C LD A,H
-
- DDDD D6 20 SUB 020H
-
- DDDF 38 02 JR C,NOOVF
-
- ;
-
- DDE1 67 LD H,A ;Overflow auf n{chsten Track
-
- DDE2 2C INC L ;Sektor = 0, Track + 1
-
- DDE3 22 DEB6 NOOVF: LD (UNATRK),HL
-
- DDE6 AF XOR A
-
- DDE7 32 DEB3 LD (RSFLAG),A ;Read nicht n|tig
-
- DDEA 18 06 JR RWOPER
-
- ;
-
- DDEC 21 0001 ALLOC: LD HL,00001H ;nicht unallocated, Read n|tig
-
- DDEF 22 DEB3 LD (RSFLAG),HL ;RSFLAG = 1 ,UNACNT = 0
-
- ;
-
- ; gemeinsamer Code f}r Read / Write
-
- ;
-
- DDF2 CD DFF0 RWOPER: CALL PATCH2
-
- DDF5 5F LD E,A
-
- DDF6 1F RRA ;rechne Host sektor
-
- DDF7 21 DE92 LD HL,INTTAB
-
- DDFA 85 ADD A,L
-
- DDFB 6F LD L,A
-
- DDFC 4E LD C,(HL)
-
- DDFD 21 DEAF LD HL,HSTACT
-
- DE00 7E LD A,(HL)
-
- DE01 36 01 LD (HL),001H ;Host aktiv Flag = 1
-
- DE03 B7 OR A ;war schon vorher aktiv ?
-
- DE04 28 1B JR Z,FILHST ;wenn nein, Buffer f}llen
-
- ;
-
- DE06 2A DEAD LD HL,(NEWDRV) ;Host Buffer war aktiv
-
- DE09 7D LD A,L
-
- DE0A BC CP H ;gleicher Drive ?
-
- DE0B 20 0D JR NZ,NOMTCH
-
- DE0D 2A F3E0 LD HL,(PHTS)
-
- DE10 3A DEA8 LD A,(IOTRK)
-
- DE13 BD CP L ;gleicher Track ?
-
- DE14 20 04 JR NZ,NOMTCH
-
- DE16 79 LD A,C
-
- DE17 BC CP H ;gleicher Sektor ?
-
- DE18 28 33 JR Z,DMATCH
-
- ;
-
- DE1A 3A DEB0 NOMTCH: LD A,(HOSTWR)
-
- DE1D B7 OR A
-
- DE1E C4 DE73 CALL NZ,WRTHST
-
- ;
-
- ; 256 Byte - Disk-Buffer f}llen
-
- ;
-
- DE21 3A DEAD FILHST: LD A,(NEWDRV)
-
- DE24 32 DEAE LD (HSTDSK),A
-
- DE27 47 LD B,A
-
- DE28 E6 01 AND 001H
-
- DE2A 3C INC A
-
- DE2B 32 F3E4 LD (DRV12),A ;Drive A: ... F: in Drive 1/2
-
- DE2E 78 LD A,B ;und Slot #6, #5, #4 rechnen
-
- DE2F E6 0E AND 00EH
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-15
-
-
-
-
-
- DE31 87 ADD A,A
-
- DE32 87 ADD A,A
-
- DE33 87 ADD A,A
-
- DE34 2F CPL
-
- DE35 C6 61 ADD A,061H
-
- DE37 32 F3E6 LD (DSKSLT),A
-
- DE3A 3A DEA8 LD A,(IOTRK)
-
- DE3D 6F LD L,A
-
- DE3E 61 LD H,C
-
- DE3F 22 F3E0 LD (PHTS),HL
-
- DE42 3A DEB3 LD A,(RSFLAG) ;Read n|tig ?
-
- DE45 B7 OR A
-
- DE46 C4 DE7A CALL NZ,REDHST
-
- DE49 AF XOR A
-
- DE4A 32 DEB0 LD (HOSTWR),A ;kein Write n|tig
-
- ;
-
- ; Buffer kopieren
-
- ;
-
- DE4D 7B DMATCH: LD A,E
-
- DE4E 21 F800 LD HL,0F800H ;0F800H = BUF1
-
- DE51 1F RRA ;erste oder zweite H{lfte ?
-
- DE52 CB 1D RR L ;HL = 0F800H oder 0F880H
-
- DE54 ED 5B DEB8 LD DE,(IOBUF)
-
- DE58 01 0080 LD BC,00080H ;DMA - Buffer L{nge
-
- DE5B 3A DEB1 LD A,(READOP)
-
- DE5E B7 OR A
-
- DE5F 20 05 JR NZ,RWMOVE ;welche Richtung ?
-
- DE61 3C INC A ; = 1
-
- DE62 32 DEB0 LD (HOSTWR),A
-
- DE65 EB EX DE,HL ;tausche Ziel und Quelle
-
- DE66 ED B0 RWMOVE: LDIR ;Buffer kopieren
-
- DE68 3A DEB2 LD A,(WRTYPE)
-
- DE6B 1F RRA
-
- DE6C 3E 00 LD A,000H
-
- DE6E D0 RET NC
-
- DE6F CD DE73 CALL WRTHST ;Directory Write
-
- DE72 C9 RET
-
- ;
-
- ; Read / Write tats{chlich ausf}hren
-
- ;
-
- DE73 AF WRTHST: XOR A
-
- DE74 32 DEB0 LD (HOSTWR),A
-
- DE77 3E 02 LD A,002H
-
- DE79 21 DEFB 021H ;(LD HL,...)
-
- DE7A 3E 01 REDHST: LD A,001H
-
- DE7C 32 F3EB LD (RDWR),A
-
- DE7F 21 0E03 LD HL,00E03H ;$0E03 = 6502 Disk Read/Write
-
- DE82 CD DB3B CALL C6502
-
- DE85 3A F3EA LD A,(DERR)
-
- DE88 B7 OR A
-
- DE89 C8 RET Z ;Z = kein Fehler
-
- DE8A D1 POP DE
-
- DE8B FE 10 CP 010H ;Write Protect Error ?
-
- DE8D C0 RET NZ
-
- DE8E 2A CC0D LD HL,(BDERR) ;ja, dann Sprung CCP Boot
-
- DE91 E9 JP (HL)
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-16
-
-
-
-
-
- ;
-
- ; Sector Interleave Tabelle
-
- ; Interleave geht }ber zwei Tabellen !
-
- ;
-
- DE92 00 09 03 0C INTTAB: DEFB 00H,09H,03H,0CH
-
- DE96 06 0F 01 0A DEFB 06H,0FH,01H,0AH
-
- DE9A 04 0D 07 08 DEFB 04H,0DH,07H,08H
-
- DE9E 02 0B 05 0E DEFB 02H,0BH,05H,0EH
-
- ;
-
- DEA2 FF CONFLG: DEFB 0FFH ;$00 f}r UC1:, $FF f}r TTY:,CRT:
-
- DEA3 00 CNTFLG: DEFB 000H ;$00 normal,$01,$02 noch 1,2 Zch
-
- DEA4 00 LDINFL: DEFB 000H ;$00 normal, $80 Lead-In
-
- DEA5 A7 SCRCUR: DEFB 0A7H ;Cursor
-
- DEA6 DE DEFB 0DEH ;
-
- DEA7 00 SCRZCH: DEFB 000H ;Zwischenspeicher Zeichen
-
- DEA8 0A IOTRK: DEFB 00AH ;Track
-
- DEA9 01 IOSEC: DEFB 001H ;Sector zu 128 Bytes !
-
- DEAA 01 CURY: DEFB 001H ;Cursor Y
-
- DEAB 3E CURX: DEFB 03EH ;Cursor X
-
- DEAC 00 OLDDRV: DEFB 000H ;old Drive Nummer
-
- DEAD 00 NEWDRV: DEFB 000H ;new Drive Nummer
-
- DEAE 00 HSTDSK: DEFB 000H ;Host Disk number
-
- DEAF 01 HSTACT: DEFB 001H ;Host aktiv Flag
-
- DEB0 00 HOSTWR: DEFB 000H ;Host written Flag
-
- DEB1 02 READOP: DEFB 002H ;2 bei Read Operation
-
- DEB2 02 WRTYPE: DEFB 002H ;Type Write Operation 0,1,2
-
- DEB3 02 RSFLAG: DEFB 002H ;Read Sector Flag
-
- DEB4 00 UNACNT: DEFB 000H ;unallocated Sector count
-
- DEB5 00 UNADSK: DEFB 000H ;letzte unalloc. Disk
-
- DEB6 0A UNATRK: DEFB 00AH ;letzter unalloc. Track
-
- DEB7 14 UNASEC: DEFB 014H ;letzter unalloc. Sector
-
- DEB8 0080 IOBUF: DW 0080H ;Buffer f}r Disk
-
- ;
-
- ; Buffer f}r BDOS
-
- ;
-
- DEBA DIRBUF: DS 128 ;Directory Buffer
-
- ;
-
- DF3A ALV0: DS 16 ;Allocation Vector, Disk Belegung
-
- DF4A ALV1: DS 16
-
- DF5A ALV2: DS 16
-
- DF6A ALV3: DS 16
-
- DF7A ALV4: DS 16
-
- DF8A ALV5: DS 16
-
- DF9A CSV0: DS 12 ;Check Vector, Test Diskettenwechs.
-
- DFA6 CSV1: DS 12
-
- DFB2 CSV2: DS 12
-
- DFBE CSV3: DS 12
-
- DFCA CSV4: DS 12
-
- DFD6 CSV5: DS 12
-
- ;
-
- IF (MSIZE EQ 56)
-
- ;
-
- ORG START+05E8H
-
- ;
-
- DFE8 CD DB3B PATCH1: CALL C6502 ;Z{hler f}r CCP-Eingabe Buffer
-
- DFEB AF XOR A ;wird auf Null gesetzt
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-17
-
-
-
-
-
- DFEC 32 C407 LD (BUFCNT),A
-
- DFEF C9 RET
-
- ;
-
- DFF0 3A DEA9 PATCH2: LD A,(IOSEC)
-
- DFF3 B7 OR A ;Carry = 0
-
- DFF4 C9 RET
-
- ;
-
- ; Vektoren f}r NMI, RESET, INTERRUPT 6502
-
- ; bei Language Card Adressen $FFFA-$FFFF
-
- ;
-
- ORG START+05FAH
-
- ;
-
- DFFA 03C0 DEFW Z80ST
-
- DFFC 03C0 DEFW Z80ST
-
- DFFE 03C0 DEFW Z80ST
-
- ;
-
- ELSE
-
- ;
-
- ORG START+05FF0H
-
- ;
-
- PATCH2: LD A,(IOSEC)
-
- OR A ;Carry = 0
-
- RET
-
- ;
-
- PATCH1: CALL C6502
-
- XOR A
-
- LD (BUFCNT),A ;Z{hler CCP-Eingabe-Buffer
-
- RET ;auf Null setzen
-
- ;
-
- ENDIF
-
- PAGE
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-18
-
-
-
-
-
-
-
- ;
-
- ; Startup - Routine
-
- ; System wird je nach den best}ckten Slots ver{ndert
-
- ;
-
- ORG START+04A8H
-
- ;
-
- DEA8 31 0100 STRTUP: LD SP,00100H
-
- DEAB 3E C9 LD A,0C9H ;RET
-
- DEAD 32 DA00 LD (START),A
-
- DEB0 3E 95 LD A,095H ;LST=LPT,PUN=PTP,RDR=PTR,CON=CRT
-
- DEB2 32 0003 LD (IOBYTE),A
-
- DEB5 2A F3DE LD HL,(0F3DEH) ;Z80 Switch kopieren
-
- DEB8 22 DB3F LD (C6502+4),HL
-
- DEBB AF XOR A
-
- DEBC 32 0004 LD (CDISK),A ;current Disk = A:
-
- ;
-
- DEBF 3A F3BB LD A,(SLTTAB+2) ;Slot 3 }berpr}fen
-
- DEC2 FE 05 CP 005H ; <5 ? 3=Com.Card, 4=Ser.Card
-
- DEC4 30 1F JR NC,SLOT1
-
- DEC6 D6 03 SUB 003H ; >=3 ?
-
- DEC8 38 1B JR C,SLOT1
-
- DECA 20 06 JR NZ,SLOT3
-
- DECC 21 1FB0 LD HL,01FB0H ;Patch LD A,(E0B0H);RRA
-
- DECF 22 DB0E LD (KEYBST+2),HL ;fuer Comcard
-
- DED2 F5 SLOT3: PUSH AF
-
- DED3 CD DF59 CALL WRPAT
-
- DED6 F1 POP AF
-
- DED7 22 DC42 LD (COEXT+4),HL
-
- DEDA CD DF54 CALL RDPAT
-
- DEDD 22 DB2D LD (CIEXT+4),HL
-
- DEE0 3E 03 LD A,003H
-
- DEE2 32 DAFD LD (DIRP+1),A ;Directory Breite
-
- ;
-
- DEE5 3A F3B9 SLOT1: LD A,(SLTTAB) ;Slot 1 }berpr}fen
-
- DEE8 D6 03 SUB 003H ;3=Com.Card, 4=Ser.Card, 5=Par.
-
- DEEA 38 08 JR C,SLOT2
-
- DEEC CD DF59 CALL WRPAT
-
- DEEF 22 DD2F LD (LSTOUT+4),HL
-
- DEF2 1E 80 LD E,080H ; ?????
-
- ;
-
- DEF4 3A F3BA SLOT2: LD A,(SLTTAB+1) ;Slot 2 }berpr}fen
-
- DEF7 D6 03 SUB 003H ;3=Com.Card, 4=Ser.Card, 5=Par.
-
- DEF9 38 14 JR C,NOINP ; >=3 ?
-
- DEFB F5 PUSH AF
-
- DEFC CD DF59 CALL WRPAT
-
- DEFF 22 DD43 LD (PUNOUT+4),HL
-
- DF02 F1 POP AF
-
- DF03 FE 02 CP 002H ;bei Parallel Card kein Input !
-
- DF05 30 08 JR NC,NOINP
-
- DF07 CD DF54 CALL RDPAT
-
- DF0A 22 DD49 LD (READIN+4),HL
-
- DF0D 18 0B JR KOPVEC
-
- ;
-
- DF0F 21 1A3E NOINP: LD HL,01A3EH ;LD A,01EH Ctrl-Z
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-19
-
-
-
-
-
- DF12 22 DD48 LD (READIN+3),HL
-
- DF15 3E C9 LD A,0C9H ;RET
-
- DF17 32 DD4A LD (READIN+5),A
-
- ;
-
- DF1A 3A F381 KOPVEC: LD A,(VECCOS+1) ;wenn Vektoren noch nicht da
-
- DF1D B7 OR A ;sind, kopieren, sonst Start-
-
- DF1E 20 0B JR NZ,STARTM ;Meldung
-
- DF20 21 DFAE LD HL,VECTOR
-
- DF23 11 F380 LD DE,VECCOS
-
- DF26 01 0016 LD BC,00016H
-
- DF29 ED B0 LDIR ;Vektoren kopieren
-
- ;
-
- DF2B CD DAA2 STARTM: CALL INICRD
-
- DF2E 3A F398 LD A,(SFLDIN+1) ;Clear Screen
-
- DF31 CD DF64 CALL OUTP
-
- DF34 3A F39B LD A,(SFLDIN+4) ;Set Normal
-
- DF37 3A DF64 LD A,(OUTP) ;gepacht, war wohl CALL OUTP
-
- DF3A 21 DF73 LD HL,MSG
-
- DF3D 7E LOOP: LD A,(HL) ;Start-Meldung ausgeben
-
- DF3E B7 OR A
-
- DF3F CA DADB JP Z,WBOOT1
-
- DF42 E5 PUSH HL
-
- DF43 CD DB42 CALL CO
-
- DF46 E1 POP HL
-
- DF47 23 INC HL
-
- DF48 18 F3 JR LOOP
-
- ;
-
- ;
-
- DF4A DCDF WRVECT: DEFW WRCOM
-
- DF4C DD04 DEFW WRSER
-
- DF4E DD31 DEFW WPRINT
-
- DF50 DD12 RDVECT: DEFW RDCOM
-
- DF52 DD1C DEFW RDSER
-
- ;
-
- DF54 21 DF50 RDPAT: LD HL,RDVECT
-
- DF57 18 03 JR PAT
-
- ;
-
- DF59 21 DF4A WRPAT: LD HL,WRVECT
-
- DF5C 87 PAT: ADD A,A
-
- DF5D 85 ADD A,L
-
- DF5E 6F LD L,A
-
- DF5F 7E LD A,(HL)
-
- DF60 2C INC L
-
- DF61 66 LD H,(HL)
-
- DF62 6F LD L,A
-
- DF63 C9 RET
-
- ;
-
- DF64 B7 OUTP: OR A
-
- DF65 F2 DF70 JP P,OUTP1 ;Lead In noetig
-
- DF68 F5 PUSH AF
-
- DF69 3A F397 LD A,(SFLDIN)
-
- DF6C CD DB42 CALL CO
-
- DF6F F1 POP AF
-
- DF70 C3 DB42 OUTP1: JP CO
-
- ;
-
- DF73 0D 0A 0D 0A MSG: DEFB 00DH,00AH,00DH,00AH,00DH,00AH
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-20
-
-
-
-
-
- DF77 0D 0A
-
- DF79 41 70 70 6C DEFB 'Apple ][ CP/M'
-
- DF7D 65 20 5D 5B
-
- DF81 20 43 50 2F
-
- DF85 4D
-
- DF86 0D 0A DEFB 00DH,00AH
-
- DF88 35 36 DEFB MSIZE/10+'0',MSIZE MOD 10+'0'
-
- ;initial 44
-
- DF8A 4B 20 56 65 DEFB 'K Ver. 2.20B'
-
- DF8E 72 2E 20 32
-
- DF92 2E 32 30 42
-
- DF96 0D 0A DEFB 00DH,00AH
-
- DF98 28 43 29 20 DEFB '(C) 1980 Microsoft'
-
- DF9C 31 39 38 30
-
- DFA0 20 4D 69 63
-
- DFA4 72 6F 73 6F
-
- DFA8 66 74
-
- DFAA 0D 0A 0A DEFB 00DH,00AH,00AH
-
- DFAD 00 DEFB 000H
-
- ;
-
- DFAE DB0C VECTOR: DEFW KEYBST
-
- DFB0 DB12 DEFW CONIN
-
- DFB2 DB12 DEFW CONIN
-
- DFB4 DC3E DEFW COEXT
-
- DFB6 DC3E DEFW COEXT
-
- DFB8 DD45 DEFW READIN
-
- DFBA DD45 DEFW READIN
-
- DFBC DD3F DEFW PUNOUT
-
- DFBE DD3F DEFW PUNOUT
-
- DFC0 DD2B DEFW LSTOUT
-
- DFC2 DD2B DEFW LSTOUT
-
- DFC4 DB42 DEFW CO
-
- PAGE
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-21
-
-
-
-
-
-
-
- ;
-
- ;
-
-
-
- ; I/O-Treiber Routinen
-
- ;
-
- ORG 0F200H
-
- ;
-
- F200 DS 128 ;reserviert f}r LST-Device
-
- F280 DS 128 ;reserviert f}r PUN/RDR-Device
-
- F300 DS 74 ;reserviert f}r TTY-Device
-
- ;
-
- F34A 3A F3BB TTYCS: LD A,(SLTTAB+2) ;0F3BBH = Slottabelle Slot 3
-
- F34D FE 03 CP 03H ;ist Com. Card ?
-
- F34F C2 DB0C JP NZ,KEYBST
-
- F352 3A E0BE LD A,(0E0BEH) ;0E0BEH Status Com. Card
-
- F355 1F RRA
-
- F356 9F SBC A,A
-
- F357 C9 RET
-
- ;
-
- ;
-
- F358 CD DB29 TTYCI: CALL CIEXT
-
- F35B E6 7F AND 07FH
-
- F35D C9 RET
-
- ;
-
- ;
-
- F35E 3A F3BB TTYCO: LD A,(SLTTAB+2) ;Slottabelle Slot 2
-
- F361 FE 03 CP 03H ;ist Com. Card ?
-
- F363 C2 DC3E JP NZ,COEXT
-
- F366 3A E0BE WART: LD A,(0E0BEH) ;Status Com. Card
-
- F369 E6 02 AND 02H
-
- F36B 28 F9 JR Z,WART ;warte auf UART
-
- F36D 79 LD A,C
-
- F36E 32 F045 LD (A$ACC),A
-
- F371 21 037C LD HL,037CH ;6502 Routine -> 0F37CH Z80
-
- F374 22 F3D0 LD (A$VEC),HL
-
- F377 2A F3DE LD HL,(0F3DEH) ;Z80SW
-
- F37A 77 LD (HL),A ;6502 Routine aufrufen
-
- F37B C9 RET
-
- ;
-
- F37C 8D BF C0 DEFB 08DH,0BFH,0C0H ;STA $C0BF
-
- F37F 60 DEFB 060H ;RET
-
- ;
-
- ; I/O Vektoren
-
- ;
-
- F380 F34A VECCOS: DW TTYCS ;Status
-
- F382 F358 VECCI1: DW TTYCI ;TTY:
-
- F384 DB29 VECCI2: DW CIEXT ;UC1:
-
- F386 F35E VECCO1: DW TTYCO ;TTY:
-
- F388 DC3E VECCO2: DW COEXT ;UC1:
-
- F38A DD45 VECRE1: DW READIN ;PTR:
-
- F38C DD45 VECRE2: DW READIN ;UR1:,UR2:
-
- F38E DD3F VECPU1: DW PUNOUT ;PTP:
-
- F390 DD3F VECPU2: DW PUNOUT ;UP1:,UP2:
-
- F392 DD2B VECLI1: DW LSTOUT ;LPT:
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE 1-22
-
-
-
-
-
- F394 DD2B VECLI2: DW LSTOUT ;UL1:
-
- ;
-
- ; Character Table
-
- ; Software Screen Functions
-
- ;
-
- F396 A0 SXYOFF: DEFB 0A0H ;Offset 020H, erst x, dann y
-
- F397 00 SFLDIN: DEFB 000H ;kein Lead-In-Zeichen
-
- F398 0C DEFB 00CH ;Ctrl-L Clear Screen
-
- F399 0B DEFB 00BH ;Ctrl-K Clear to End of Page
-
- F39A 1D DEFB 01DH ;Ctrl-] Clear to End of Line
-
- F39B 0E DEFB 00EH ;Ctrl-N Set Normal
-
- F39C 0F DEFB 00FH ;Ctrl-O Set Inverse ( High-Lite )
-
- F39D 19 DEFB 019H ;Ctrl-Y Home Cursor
-
- F39E 1E DEFB 01EH ;Ctrl-~ Adress Cursor
-
- F39F 1F DEFB 01FH ;US Move Cursor Up one line
-
- F3A0 1C DEFB 01CH ;Ctrl-\ Cursor Move Forward nond.
-
- ;
-
- ; Hardware Screen Functions
-
- ;
-
- F3A1 A0 HXYOFF: DEFB 0A0H ;Offset 020H, erst x , dann y
-
- F3A2 00 HFLDIN: DEFB 000H ;kein Lead-In-Zeichen
-
- F3A3 0C DEFB 00CH ;Ctrl-L
-
- F3A4 0B DEFB 00BH ;Ctrl-K
-
- F3A5 1D DEFB 01DH ;Ctrl-]
-
- F3A6 0E DEFB 00EH ;Ctrl-N
-
- F3A7 0F DEFB 00FH ;Ctrl-O
-
- F3A8 19 DEFB 019H ;Ctrl-Y
-
- F3A9 1E DEFB 01EH ;Ctrl-~
-
- F3AA 1F DEFB 01FH ;US
-
- F3AB 1C DEFB 01CH ;Ctrl-\
-
- ;
-
- ; Character Umcodier-Tabelle
-
- ;
-
- F3AC 00 7F CHRRED: DEFB 000H,07FH ;NUL -> DEL
-
- F3AE 15 09 DEFB 015H,009H ;NAK -> Ctrl-I
-
- F3B0 FF FF DEFB 0FFH,0FFH ;Tabellenende High-Bit gesetzt
-
- F3B2 FF FF DEFB 0FFH,0FFH
-
- F3B4 FF FF DEFB 0FFH,0FFH
-
- F3B6 FF FF DEFB 0FFH,0FFH ;6 Umcodierungen
-
- ;
-
- F3B8 02 DSKCNT: DEFB 002H ;Zahl der vorhandenen Laufwerke
-
- ;
-
- ; Slotbelegungstabelle ( siehe Softcard Dokument. )
-
- ;
-
- F3B9 05 SLTTAB: DEFB 005H ;Slot 1 Parallel Printer Interf.
-
- F3BA 03 DEFB 003H ;Slot 2 Communications Card
-
- F3BB 04 DEFB 004H ;Slot 3 80 Zeichen-Karte (Serial)
-
- F3BC 00 DEFB 000H ;Slot 4 Z80-Card (nicht erkannt)
-
- F3BD 01 DEFB 001H ;Slot 5 unbekannte Karte
-
- F3BE 02 DEFB 002H ;Slot 6 Apple Disk II Contr.
-
- F3BF 00 DEFB 000H ;Slot 7 keine Karte erkannt
-
- ;
-
- ;
-
- END
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE S
-
-
-
-
-
- Macros:
-
-
-
- Symbols:
-
- A$ACC F045 A$VEC F3D0 A$XREG F046 A$YREG F047
-
- ALLOC DDEC ALV0 DF3A ALV1 DF4A ALV2 DF5A
-
- ALV3 DF6A ALV4 DF7A ALV5 DF8A APPKBD E000
-
- APPKST E010 APPSCR DC44 BASCAL DCAA BASL F028
-
- BDERR CC0D BDOS 0005 BDOSST 0006 BDST CC06
-
- BIAS 9000 BIOS DA00 BOOT 0000 BOOTST 0001
-
- BUFCNT C407 BYTE F678 C6502 DB3B CBASE C400
-
- CC6502 DD0F CCPDIR C8B2 CDISK 0004 CH F024
-
- CHKUNA DDBD CHRRED F3AC CI1 DB5E CIEXT DB29
-
- CLRROM EFFF CMWAIT DCE2 CNTFLG DEA3 CO DB42
-
- COEXT DC3E CON DB97 CONFLG DEA2 CONIN DB12
-
- CONINP DB50 CONOUT DB43 CONST DB08 COUT DBDD
-
- CSV0 DF9A CSV1 DFA6 CSV2 DFB2 CSV3 DFBE
-
- CSV4 DFCA CSV5 DFD6 CURX DEAB CURY DEAA
-
- DERR F3EA DIRBUF DEBA DIRP DAFC DMATCH DE4D
-
- DPB DA93 DPE0 DA33 DRV12 F3E4 DSKCNT F3B8
-
- DSKERR DD84 DSKSLT F3E6 ENDKEY DB27 FILHST DE21
-
- FINISH DC2D FUN1 DCBA FUN10 DCBF FUN2 DCB1
-
- FUN3 DCB4 FUN4 DC96 FUN5 DC99 FUN6 DCA4
-
- FUN7 DC9E FUN8 DCB7 FUN9 DCA0 FUNTAB DCD5
-
- HFLDIN F3A2 HOME DD4B HOSTWR DEB0 HSTACT DEAF
-
- HSTDSK DEAE HXYOFF F3A1 INICRD DAA2 INTTAB DE92
-
- INVFLG F032 IOBUF DEB8 IOBYTE 0003 IOSEC DEA9
-
- IOTRK DEA8 JMPHL DB65 JPHL1 DC3D KEYBIN DB2F
-
- KEYBST DB0C KOPVEC DF1A LDINFL DEA4 LIST DB66
-
- LIST1 DB4C LOOP DF3D LSTOUT DD2B MATCH DC0C
-
- MSG DF73 MSIZE 0038 NEWDRV DEAD NOCH1 DBB8
-
- NOCOM DAB5 NOCR DC84 NOFUN DC7A NOINP DF0F
-
- NOLEAD DC23 NOMTCH DE1A NOOVF DDE3 NOSER DAC1
-
- NOSWAP DBCF NOTAVL DC07 NOTWR DD54 OLDDRV DEAC
-
- OUTP DF64 OUTP1 DF70 PAT DF5C PATCH1 DFE8
-
- PATCH2 DFF0 PHTS F3E0 PREP DCEE PUNCH DB75
-
- PUNOUT DD3F PWAIT DD36 RCWAIT DD15 RDCOM DD12
-
- RDPAT DF54 RDSER DD1C RDVECT DF50 RDWR F3EB
-
- READ DD93 READ1 DB62 READER DB87 READIN DD45
-
- READOP DEB1 REDHST DE7A RET1 DD3E RSFLAG DEB3
-
- RWMOVE DE66 RWOPER DDF2 SCRCUR DEA5 SCRFUN DC6B
-
- SCRZCH DEA7 SEARCH DBF5 SELDSK DD6D SETDMA DD8E
-
- SETSEC DD89 SETTRK DD56 SFLDIN F397 SLOT F6F8
-
- SLOT1 DEE5 SLOT2 DEF4 SLOT3 DED2 SLSTAT DD60
-
- SLT1 DD63 SLT2 DD64 SLTADD DAC5 SLTDAT DD5B
-
- SLTTAB F3B9 SPREP DCEA SRCH2 DBFA START DA00
-
- STARTM DF2B STRTUP DEA8 SUBOF2 DBB3 SUBOFF DBB1
-
- SXYOFF F396 TCONT DBE0 TESTFN DBFF TSTKEY DB1B
-
- TTY DB96 TTYCI F358 TTYCO F35E TTYCS F34A
-
- TXTSET E051 UC DC8E UNACNT DEB4 UNADSK DEB5
-
- UNASEC DEB7 UNATRK DEB6 UP DC65 VECCI1 F382
-
- VECCI2 F384 VECCO1 F386 VECCO2 F388 VECCOS F380
-
- VECLI1 F392 VECLI2 F394 VECPU1 F38E VECPU2 F390
-
- VECRE1 F38A VECRE2 F38C VECTOR DFAE WART F366
-
- WBOOT DACC WBOOT1 DADB WBOOTE DA03 WEITER DAA5
-
- WPRINT DD31 WRCOM DCDF WRITE DDA3 WRPAT DF59
-
- WRSER DD04 WRTHST DE73 WRTYPE DEB2 WRVECT DF4A
-
- XOK DCC9 XY DBBD YOK DCD0 Z80CRD E400
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE S-1
-
-
-
-
-
- Z80ST 03C0
-
-
-
-
-
-
-
- No Fatal error(s)
-
-
-
-
-
- YOK DCD0 Z80CRD E400
-
- "APPLE CP/M BIOS" MACRO-80 3.4 01-Dec-80 PAGE S-1
-
-
-
-
-
- Z80ST 03C0
-
-
-
-
-
-
- eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee